package client.subsistema1;

import beans.Administrador;
import beans.Estudiant;
import beans.ResponsableEvents;
import beans.Usuari;
import client.subsistema1.PantallaAdministracioUsuaris;
import client.subsistema1.PantallaLogin;
import client.subsistema2.AltaProves;
import client.subsistema2.TancamentProves;
import client.subsistema2.ControlInscripcions;
import client.subsistema3.PantallaResumExecutiu;
import client.subsistema4.PantallaSeleccio;
import common.EOlympicsException;
import common.RemoteInterface;
import java.io.File;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;

/**
 *
 * @author Albert
 */
public class Client extends javax.swing.JFrame {

    private RemoteInterface remoto;
    private final String url = new String("rmi://localhost/RemoteInterface");
    private Usuari usuari;
    private PantallaLogin pantallaLogin;
    private PantallaAdministracioUsuaris pantallaAdministracio;
    
    /**
     * Creates new form Client
     */
    public Client() {
        initComponents();
        
        // center the jframe on screen
        this.setLocationRelativeTo(null);
        
        
    }

    /**
     * Crea el menu de login 
     */
    void createMenuLogin(){
        System.out.print("Creating new menu login");
        menuGeneral = new javax.swing.JMenuBar();
        
        //Menu1
        JMenu jMenu1 = new javax.swing.JMenu();
        jMenu1.setText("Arxiu");
        JMenuItem jMenuItem1 = new javax.swing.JMenuItem();
        jMenuItem1.setText("Login");
        jMenuItem1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                gotologin(evt);
            }
        });
        jMenu1.add(jMenuItem1);
        
        JMenuItem jMenuItem2 = new javax.swing.JMenuItem();
        jMenuItem2.setText("Sortir");
        jMenuItem2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                gotosortir(evt);
            }
        });
        jMenu1.add(jMenuItem2);
        
        menuGeneral.add(jMenu1);
        
        setJMenuBar(menuGeneral);

        pack();
    }
    
    /**
     * Crea el menu d'administracció 
     */
    void createMenuAdministracio(){
        System.out.println("Creating new menu Administració");
        menuGeneral = new javax.swing.JMenuBar();
        
        //Menu1
        JMenu jMenu1 = new javax.swing.JMenu();
        jMenu1.setText("Arxiu");
        //Menu Item 1.1
        JMenuItem jMenuItem11 = new javax.swing.JMenuItem();
        jMenuItem11.setText("Sortir");
        jMenuItem11.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                gotosortir(evt);
            }
        });
        jMenu1.add(jMenuItem11);
        
        
        //Menu2
        JMenuItem jMenu2 = new javax.swing.JMenuItem();
        jMenu2.setText("Administrar usuaris");
        jMenu2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                gotoadministracio(evt);
            }
        });
        
        
        //Menu3
        JMenuItem jMenu3 = new javax.swing.JMenuItem();
        jMenu3.setText("Log out");
        jMenu3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                gotologout(evt);
            }
        });
        
        menuGeneral.add(jMenu1);
        menuGeneral.add(jMenu2);
        menuGeneral.add(jMenu3);
        
        setJMenuBar(menuGeneral);
        pack();
    }
    
    /**
     * Crea el menú del responsable d'events
     */
    void createMenuResponsable(){
        System.out.println("Creating new menu Responsable");
        menuGeneral = new javax.swing.JMenuBar();
        
        //Menu1
        JMenu jMenu1 = new javax.swing.JMenu();
        jMenu1.setText("Arxiu");
        
        JMenuItem jMenuItem11 = new javax.swing.JMenuItem();
        jMenuItem11.setText("Sortir");
        jMenuItem11.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                gotosortir(evt);
            }
        });
        jMenu1.add(jMenuItem11);
        
        
        //Menu2
        JMenu jMenu2 = new javax.swing.JMenu();
        jMenu2.setText("Proves");
        //Menu Item 2.1
        JMenuItem jMenuItem21 = new javax.swing.JMenuItem();
        jMenuItem21.setText("Manteniment");
        jMenuItem21.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                gotoManteniment(evt);
            }
        });
        jMenu2.add(jMenuItem21);
        //Menu Item 2.2
        JMenuItem jMenuItem22 = new javax.swing.JMenuItem();
        jMenuItem22.setText("Tancar competicio");
        jMenuItem22.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                gotoTancarCompeticio(evt);
            }
        });
        jMenu2.add(jMenuItem22);
        //Menu Item 2.3
        JMenuItem jMenuItem23 = new javax.swing.JMenuItem();
        jMenuItem23.setText("Control de inscripcions");
        jMenuItem23.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                gotoControlInscripcions(evt);
            }
        });
        jMenu2.add(jMenuItem23);


        //SUBSISTEMA 3: ESTADISTIQUES INICI

        //Menu3
        JMenu jMenu3 = new javax.swing.JMenu();
        jMenu3.setText("Estadistiques");
        //Menu Item 3.1
        JMenuItem jMenuItem31 = new javax.swing.JMenuItem();
        jMenuItem31.setText("Medaller olimpic");
        jMenuItem31.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                gotoEstadistiques(evt);
            }
        });
        //Menu Item 3.2
        JMenuItem jMenuItem32 = new javax.swing.JMenuItem();
        jMenuItem32.setText("Proves Finalitzades");
        jMenuItem32.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                gotoEstadistiques(evt);
            }
        });
        //Menu Item 3.3
        JMenuItem jMenuItem33 = new javax.swing.JMenuItem();
        jMenuItem33.setText("Resultats Propis");
        jMenuItem33.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                gotoEstadistiques(evt);
            }
        });
        //Menu Item 3.4
        JMenuItem jMenuItem34 = new javax.swing.JMenuItem();
        jMenuItem34.setText("Resum Executiu");
        jMenuItem34.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                    gotoEstadistiquesResumExecutiu(evt);
            }
        });
        jMenu3.add(jMenuItem31);
        jMenu3.add(jMenuItem32);
        jMenu3.add(jMenuItem33);
        jMenu3.add(jMenuItem34);

        //SUBSISTEMA 3: ESTADISTIQUES FI





        //Menu4
        JMenuItem jMenu4 = new javax.swing.JMenuItem();
        jMenu4.setText("Log out");
        jMenu4.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                gotologout(evt);
            }
        });
        
        menuGeneral.add(jMenu1);
        menuGeneral.add(jMenu2);
        menuGeneral.add(jMenu3);
        menuGeneral.add(jMenu4);
        
        setJMenuBar(menuGeneral);

        pack();
    }

    /**
     * Crea el menú de l'estudiant
     */
    void createMenuEstudiant(){
        System.out.println("Creating new menu Estudiant");
        menuGeneral = new javax.swing.JMenuBar();
        
        //Menu1
        JMenu jMenu1 = new javax.swing.JMenu();
        jMenu1.setText("Arxiu");
        //Menu Item 1.1
        JMenuItem jMenuItem11 = new javax.swing.JMenuItem();
        jMenuItem11.setText("Sortir");
        jMenuItem11.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                gotosortir(evt);
            }
        });
        jMenu1.add(jMenuItem11);
        
        
        //Menu2
        JMenuItem jMenu2 = new javax.swing.JMenuItem();
        jMenu2.setText("Seleccio Estudiant");
        jMenu2.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                gotoSeleccioEstudiant(evt);
            }
        });
        
        //Menu3
        JMenuItem jMenu3 = new javax.swing.JMenuItem();
        jMenu3.setText("Estadistiques");
        jMenu3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                gotoEstadistiques(evt);
            }
        });
        
        //Menu4
        JMenuItem jMenu4 = new javax.swing.JMenuItem();
        jMenu4.setText("Log out");
        jMenu4.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                gotologout(evt);
            }
        });
        
        menuGeneral.add(jMenu1);
        menuGeneral.add(jMenu2);
        menuGeneral.add(jMenu3);
        menuGeneral.add(jMenu4);
        
        setJMenuBar(menuGeneral);

        pack();

    }
    
    /**
     * Obra la pantalla de login 
     * @param evt event que executa l'acció
     */
    private void gotologin(java.awt.event.ActionEvent evt) {
        pantallaLogin = new PantallaLogin(this);
        pantallaLogin.setVisible(true);
    }
    
    /**
     * Obra la pantalla d'administracció 
     * @param evt event que executa l'acció
     */
    private void gotoadministracio(java.awt.event.ActionEvent evt) {
        pantallaAdministracio = new PantallaAdministracioUsuaris(remoto,(Administrador)usuari);
        pantallaAdministracio.setVisible(true);
    }
    
    /**
     * Fa un log out de l'usuari, creant de nou el menú de login 
     * @param evt event que executa l'acció
     */
    private void gotologout(java.awt.event.ActionEvent evt) {
        usuari = null;
        createMenuLogin();
    }
    
    /**
     * Finalitza el programa 
     * @param evt event que executa l'acció
     */
    private void gotosortir(java.awt.event.ActionEvent evt) {
        System.exit(0);
    }
    

    /**
     * Obra la pantalla de manteniment de proves 
     * @param evt event que executa l'acció
     */
    private void gotoManteniment(java.awt.event.ActionEvent evt) {
         //S'accedeix al subsistema 2: subsistema de proves. (Dani)
         System.out.println("Accedint al subsistema de proves");
         int idIntern = usuari.getIdIntern().intValue();
         AltaProves altaProves = new AltaProves(remoto, idIntern) {
            {
                setVisible(true);
            }
        };
    }

    
    /**
     * Obra la pantalla de tancament de competicions 
     * @param evt event que executa l'acció
     */
    private void gotoTancarCompeticio(java.awt.event.ActionEvent evt) {
         //S'accedeix al subsistema 2: subsistema de proves. (Dani)
         System.out.println("Accedint al subsistema de proves");
         int idIntern = usuari.getIdIntern().intValue();
         TancamentProves tancamentProves = new TancamentProves(remoto, idIntern) {
            {
                setVisible(true);
            }
        };
    }


    /**
     * Obra la pantalla d'inscripcions 
     * @param evt event que executa l'acció
     */
    private void gotoControlInscripcions(java.awt.event.ActionEvent evt) {
         //S'accedeix al subsistema 2: subsistema de proves. (Dani)
         System.out.println("Accedint al subsistema de proves");
         int idIntern = usuari.getIdIntern().intValue();
         ControlInscripcions controlInscripcions = new ControlInscripcions(remoto, idIntern) {
            {
                setVisible(true);
            }
        };
    }



    /**
     * Obra la pantalla de l'estudiant, on pot seleccionar la opció que vol realitzar 
     * @param evt event que executa l'acció
     */
    private void gotoSeleccioEstudiant(java.awt.event.ActionEvent evt) {
         //S'accedeix al subsistema 4: subsistema de l'estudiant. (Frank)
         System.out.println("Accedint al subsistema del estudiant");
         String username = usuari.getIdUsuari();
         PantallaSeleccio pantallaSeleccio = new PantallaSeleccio(remoto, username) {
            {
                setVisible(true);
            }
        };
    }


    /**
     * Obra la pantalla d'estadístiques 
     * @param evt event que executa l'acció
     */
    private void gotoEstadistiques(java.awt.event.ActionEvent evt) {
        //S'accedeix al subsistema 3: subsistema de estadístiques. (Roger)
        System.out.println("Accedint al subsistema de estadistiques No Implementat");
        String username = usuari.getIdUsuari();
        //Això però amb la pantalla de estadistiques del Roger
    }



    /**
     * Obra la pantalla d'estadístiques
     * @param evt event que executa l'acció
     */
    private void gotoEstadistiquesResumExecutiu(java.awt.event.ActionEvent evt) {
        //S'accedeix al subsistema 3: subsistema de estadístiques. (Roger)
        System.out.println("Accedint al subsistema de estadistiques per a responsable");

        PantallaResumExecutiu pantallaResumExecutiu = new PantallaResumExecutiu(remoto,(ResponsableEvents) usuari) {
           {
               setVisible(true);
           }
       };

        //Això però amb la pantalla de estadistiques del Roger
    }






    /**
     * Crea la connexió amb el servidor i intenta fer el login amb un usuari i password.<br>
     * En cas d'error, la excepció EOlympicsException informarà a l'usuari del motiu de no haver-se pogut loguejar
     * @param login login de l'usuari
     * @param password password de l'usuari
     */
    public void login(String login, String password){
        java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("i18n/subsistema1/messagesSubsistema1"); // NOI18N
        
                
        try{
                System.out.println("\nConectando al servidor desde cliente...");
                remoto=(RemoteInterface)Naming.lookup(url);
                System.out.println("\n¡Conectado!");

                
                System.out.print("\nLogin: "+login+" - Password: "+password);

                usuari = remoto.sub1login(login, password);
                
                
                if(usuari==null) throw new EOlympicsException(bundle.getString("client.error_login"));
                
                System.out.print("\nUsuari loguejat: "+usuari);
                
                System.out.print("\nTipus usuari: "+usuari.getTipusUsuari());
                
                System.out.print("\nId intern: "+usuari.getIdIntern());
                System.out.print("\nId usuari: "+usuari.getIdUsuari());
                System.out.print("\nPassword: "+usuari.getPwd());
                System.out.print("\nTipus de document: "+usuari.getTipusDocumentId());
                System.out.print("\nDocument: "+usuari.getDocument());
                System.out.print("\nEmail: "+usuari.getEmail());
                System.out.print("\nEstat en el sistema: "+usuari.getEstatEnSistema());
                System.out.print("\nData alta: "+usuari.getDataAlta());
                System.out.print("\nData baixa: "+usuari.getDataBaixa());
                System.out.print("\nData modificacio: "+usuari.getDataMod());
                System.out.print("\nUsuari alta: "+usuari.getUsuariAlta());
                System.out.print("\nUsuari baixa: "+usuari.getUsuariBaixa());
                System.out.print("\nUsuari modificacio: "+usuari.getUsuariMod());
                
                if(usuari.getTipusUsuari().equalsIgnoreCase("A")){
                    Administrador administrador = (Administrador)usuari;
                    System.out.print("\nId administrador: "+administrador.getIdAdministrador());
                    
                    createMenuAdministracio();
                }else if(usuari.getTipusUsuari().equalsIgnoreCase("R")){
                    ResponsableEvents responsable = (ResponsableEvents)usuari;
                    System.out.print("\nId responsable events: "+responsable.getIdResponsable());
                    
                    createMenuResponsable();
                }else if(usuari.getTipusUsuari().equalsIgnoreCase("E")){
                    Estudiant estudiant = (Estudiant)usuari;
                    System.out.print("\nId estudiant: "+estudiant.getIdEstudiant());
                    System.out.print("\nUniversitat: "+estudiant.getUniversitat());
                    
                    createMenuEstudiant();
                }
                
                pantallaLogin.dispose();
        

        }catch (EOlympicsException e) {
                System.out.print("EOlympicsException");
                JOptionPane.showMessageDialog(pantallaLogin, e.getMessage(),
                        bundle.getString("client.titol_error_client"), JOptionPane.WARNING_MESSAGE);
        }catch (NotBoundException e) {
                System.out.print("Not bound Exception");
                JOptionPane.showMessageDialog(pantallaLogin, bundle.getString("client.error_rmi"),
                        bundle.getString("client.titol_error_client"), JOptionPane.WARNING_MESSAGE);
        }catch (RemoteException e) {
                System.out.print("Remote Exception");
                JOptionPane.showMessageDialog(pantallaLogin, bundle.getString("client.error_rmi"),
                        bundle.getString("client.titol_error_client"), JOptionPane.WARNING_MESSAGE);
        }catch (MalformedURLException e) {
            JOptionPane.showMessageDialog(pantallaLogin, bundle.getString("client.error_rmi"),
                        bundle.getString("client.titol_error_client"), JOptionPane.WARNING_MESSAGE);
        }catch (Exception e){
                System.out.print("Exception");
                JOptionPane.showMessageDialog(pantallaLogin, bundle.getString("client.error_rmi"),
                        bundle.getString("client.titol_error_client"), JOptionPane.WARNING_MESSAGE);
        }
        
    }
    
    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        menuGeneral = new javax.swing.JMenuBar();
        jMenu1 = new javax.swing.JMenu();
        jMenu2 = new javax.swing.JMenu();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        java.util.ResourceBundle bundle = java.util.ResourceBundle.getBundle("i18n/subsistema1/messagesSubsistema1"); // NOI18N
        setTitle(bundle.getString("client.title")); // NOI18N
        setBackground(new java.awt.Color(255, 255, 255));
        setBounds(new java.awt.Rectangle(0, 0, 450, 400));
        setPreferredSize(new java.awt.Dimension(500, 500));

        jLabel1.setBackground(new java.awt.Color(255, 255, 255));
        jLabel1.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
        jLabel1.setIcon(new javax.swing.ImageIcon(new File(".").getAbsolutePath() + "/imatges/subsistema1/" + "eOlympics Logo.JPG"));

        jMenu1.setText("File");
        menuGeneral.add(jMenu1);

        jMenu2.setText("Edit");
        menuGeneral.add(jMenu2);

        setJMenuBar(menuGeneral);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 297, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jLabel1, javax.swing.GroupLayout.DEFAULT_SIZE, 236, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /*
         * Set the Nimbus look and feel
         */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /*
         * If Nimbus (introduced in Java SE 6) is not available, stay with the
         * default look and feel. For details see
         * http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        /*try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(Client.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(Client.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(Client.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(Client.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }*/
        //</editor-fold>

        /*
         * Create and display the form
         */
        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {
                Client client = new Client();
                client.createMenuLogin();
                client.setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel jLabel1;
    private javax.swing.JMenu jMenu1;
    private javax.swing.JMenu jMenu2;
    private javax.swing.JMenuBar menuGeneral;
    // End of variables declaration//GEN-END:variables
}
